#include <iostream>

using namespace std;
//拷贝构造函数的三种调用时机
//1、使用一个已经创建完些的对象来初始化一个新对象
//2、值传递的方式给函数参数传值
//3、以值方式返回局部对象

class Person {
public:
    int age;

    Person() {//无参构造
        cout << "默认构造函数的调用!" << endl;
    }

    Person(int age) {//有参构造
        this->age = age;
        cout << "有参构造函数的调用!" << endl;
    }

    Person(const Person &person) {//拷贝构造
        this->age = person.age;
        cout << "拷贝构造函数的调用!" << endl;
    }

    ~Person() {//析构函数
        cout << "析构函数的调用!" << endl;
    }
};

//1、使用一个已经创建完些的对象来初始化一个新对象
void test1() {

    Person p1(20);
    Person p2(p1);
    cout << "p2:age=" << p2.age << endl;
}

//2、值传递的方式给函数参数传值
void doWork(Person person) {
    cout << endl;
}

void test2() {
    Person p;
    doWork(p);
}

//3、以值方式返回局部对象
Person show() {
    Person p;
    cout << &p << endl;
    return p;
}

void test3() {
    Person p = show();
    cout << &p << endl;
}

int main() {
    //test1();
    //test2();
    test3();
    return 0;
}